package com.michael.leetcode;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

@Slf4j
public class GameOfLife_289 {
    /**
     * 289. 生命游戏
    根据 百度百科 ， 生命游戏 ，简称为 生命 ，是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
    给定一个包含 m × n 个格子的面板，每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态： 1 即为 活细胞 （live），或 0 即为 死细胞 （dead）。每个细胞与其八个相邻位置（水平，垂直，对角线）的细胞都遵循以下四条生存定律：
    如果活细胞周围八个位置的活细胞数少于两个，则该位置活细胞死亡；
    如果活细胞周围八个位置有两个或三个活细胞，则该位置活细胞仍然存活；
    如果活细胞周围八个位置有超过三个活细胞，则该位置活细胞死亡；
    如果死细胞周围正好有三个活细胞，则该位置死细胞复活；
    下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的，其中细胞的出生和死亡是 同时 发生的。给你 m x n 网格面板 board 的当前状态，返回下一个状态。
    给定当前 board 的状态，更新 board 到下一个状态。

    注意 你不需要返回任何东西。

    示例 1：
    输入：board = [[0,1,0],[0,0,1],[1,1,1],[0,0,0]]
    输出：[[0,0,0],[1,0,1],[0,1,1],[0,1,0]]

    示例 2：
    输入：board = [[1,1],[1,0]]
    输出：[[1,1],[1,1]]

    提示：
    m == board.length
    n == board[i].length
    1 <= m, n <= 25
    board[i][j] 为 0 或 1
     */
    public void gameOfLife(int[][] board) {

        int[][] tt = new int[board.length][board[0].length];

        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[i].length; j++) {
                int alive = isAlive(i, j, board);
                tt[i][j] = alive;
            }
        }
        log.info("{}", tt);

        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[i].length; j++) {
                int c = board[i][j];
                int as = tt[i][j];
                if (c== 1){
                    if (as < 2 || as > 3){
                        board[i][j] = 0;
                    }
                }else {
                    if (as == 3){
                        board[i][j] = 1;
                    }
                }
            }
        }

        log.info("{}", board);
    }


    private int isAlive(int x, int y, int[][] board){
        int sx = x - 1 >= 0 ? x - 1 : x;
        int sy = y - 1 >= 0 ? y - 1 : y;
        int ex = x + 1 < board.length ? x + 1 : x;
        int ey = y + 1 < board[0].length ? y + 1 : y;
        int a = 0;
        for (int i = sx; i <= ex; i++) {
            for (int j = sy; j <= ey; j++) {
                if (i==x && j== y){
                    continue;
                }
                if (board[i][j]==1){
                    a++;
                }
            }
        }

       return a;
    }

    @Test
    public void test(){
        int[][] board = {{0,1,0},{0,0,1},{1,1,1},{0,0,0}};
        gameOfLife( board);
    }

}